home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 November: Tool Chest / Dev.CD Nov 96 TC / Dev.CD Nov 96 TC.toast / Sample Code / Interapplication Communication / MenuScripter 4.0 / Sources / MSAEUtils.c < prev    next >
Encoding:
Text File  |  1996-07-09  |  7.0 KB  |  312 lines  |  [TEXT/CWIE]

  1. // MSAEUtils.c
  2. //
  3. // Original version by Jon Lansdell and Nigel Humphreys.
  4. // 4.0 and 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1996, all rights reserved.
  6.  
  7. #pragma segment Main
  8.  
  9. #include "MSAEUtils.h"
  10.  
  11. #include "MSUtils.h"
  12. #include "MSWindow.h"
  13.  
  14. #include "MSAERecording.h"
  15.  
  16. #include <AERegistry.h>
  17. #include <AEObjects.h>
  18.  
  19.  
  20. // -----------------------------------------------------------------------
  21. //    Utility Routines for getting data from AEDesc's
  22. // -----------------------------------------------------------------------
  23.     
  24. void    GetRawDataFromDescriptor(const AEDesc *theDesc, Ptr destPtr,
  25.                                         Size destMaxSize, Size *actSize)
  26. {
  27.     Size copySize;
  28.     
  29.     if (theDesc->dataHandle) 
  30.     {
  31.         HLock((Handle)theDesc->dataHandle);
  32.         *actSize = GetHandleSize((Handle)theDesc->dataHandle);
  33.         
  34.         copySize = LesserOf(*actSize, destMaxSize);
  35.         
  36.         BlockMove(*theDesc->dataHandle, destPtr, copySize);
  37.         
  38.         HUnlock((Handle)theDesc->dataHandle);
  39.     }
  40.     else
  41.         *actSize = 0;
  42. } // GetRawDataFromDescriptor
  43.  
  44.  
  45. OSErr    GetPStringFromDescriptor(const AEDesc *aDesc, StringPtr resultStr)
  46. {
  47.     Size         stringSize;
  48.     AEDesc       resultDesc = {typeNull, NULL};
  49.     OSErr        err;
  50.     
  51.     err = AECoerceDesc(aDesc, typeChar, &resultDesc);
  52.     if (noErr != err) goto done;
  53.     
  54.     resultStr[0] = 0;
  55.     
  56.     GetRawDataFromDescriptor(&resultDesc, (Ptr)&resultStr[1], 255, &stringSize);
  57.     if (stringSize <= 255) 
  58.         resultStr[0] = stringSize;
  59.     else
  60.         err = errAECoercionFail;
  61.  
  62. done:        
  63.     (void)AEDisposeDesc(&resultDesc);
  64.         
  65.     return(err);
  66. }
  67.     
  68.  
  69. OSErr    PutPStringToDescriptor(AEDesc* aDesc, StringPtr pStr)
  70. {
  71.     OSErr        err;
  72.     
  73.     if (! aDesc || ! pStr)
  74.         return(errAETypeError);
  75.  
  76.     err = AECreateDesc(typeChar, (Ptr)&pStr[1], pStr[0], aDesc);
  77.         
  78.     return(err);
  79. }
  80.  
  81.  
  82. OSErr    GetIntegerFromDescriptor(const AEDesc *sourceDesc, short *result)
  83. {
  84.       OSErr   myErr;
  85.     OSErr   ignoreErr;
  86.     Size    intSize;
  87.     AEDesc  resultDesc;
  88.     
  89.     *result = 0;
  90.     myErr = AECoerceDesc( sourceDesc, typeShortInteger, &resultDesc );
  91.     
  92.     if ( myErr == noErr ) 
  93.     {
  94.         GetRawDataFromDescriptor(&resultDesc, (Ptr)result, 2, &intSize);
  95.         if ( intSize > 2 ) 
  96.             myErr = errAECoercionFail;
  97.     }
  98.     
  99.     if (resultDesc.dataHandle) 
  100.         ignoreErr = AEDisposeDesc(&resultDesc);
  101.         
  102.     return(myErr);
  103. }
  104.     
  105. OSErr    GetBooleanFromDescriptor(const AEDesc *sourceDesc, Boolean *result)
  106. {
  107.     OSErr  myErr;
  108.     OSErr  ignoreErr;
  109.     Size   boolSize;
  110.     AEDesc resultDesc;
  111.     
  112.     *result = false;
  113.     myErr = AECoerceDesc(sourceDesc,typeBoolean,&resultDesc);
  114.     
  115.     if (myErr==noErr) 
  116.         {
  117.             GetRawDataFromDescriptor(&resultDesc,
  118.                                                              (Ptr)result,
  119.                                                              sizeof(Boolean),
  120.                                                              &boolSize);
  121.             if (boolSize>sizeof(Boolean)) 
  122.                 myErr = errAECoercionFail;
  123.         }
  124.     
  125.     if (resultDesc.dataHandle) 
  126.         ignoreErr = AEDisposeDesc(&resultDesc);
  127.         
  128.     return(myErr);
  129. }
  130.  
  131. OSErr    GetLongIntFromDescriptor(const AEDesc *sourceDesc, long *result)
  132. {
  133.     OSErr   myErr;
  134.     Size    intSize;
  135.     AEDesc  resultDesc = { typeNull, NULL };
  136.     
  137.     *result = 0;
  138.     myErr = AECoerceDesc(sourceDesc,typeLongInteger,&resultDesc);
  139.     
  140.     if (myErr==noErr) 
  141.     {
  142.         GetRawDataFromDescriptor(&resultDesc, (Ptr)result, 4, &intSize);
  143.         if (intSize>4) 
  144.             myErr = errAECoercionFail;
  145.     }
  146.     
  147.     (void)AEDisposeDesc(&resultDesc);
  148.     
  149.     return(myErr);
  150. } // GetLongIntFromDescriptor
  151.  
  152. OSErr    GetRectFromDescriptor(const AEDesc *sourceDesc, Rect *result)
  153. {
  154.     OSErr   myErr;
  155.     Size    rectSize;
  156.     AEDesc  resultDesc = { typeNull, NULL };
  157.         
  158.     SetRect(result,0,0,0,0);
  159.     myErr = AECoerceDesc(sourceDesc,typeQDRectangle,&resultDesc);
  160.     
  161.     if (myErr==noErr) 
  162.     {
  163.         GetRawDataFromDescriptor(&resultDesc, (Ptr)result, sizeof(Rect), &rectSize);
  164.         if ( rectSize < sizeof( Rect ) ) 
  165.             myErr = errAECoercionFail;
  166.     }
  167.     
  168.     (void)AEDisposeDesc(&resultDesc);
  169.         
  170.     return(myErr);
  171. } // GetRectFromDescriptor
  172.  
  173. OSErr    GetPointFromDescriptor(const AEDesc *sourceDesc, Point  *result)
  174. {
  175.     OSErr   myErr;
  176.     Size    ptSize;
  177.     AEDesc  resultDesc = { typeNull, NULL };
  178.     
  179.     SetPt(result,0,0);
  180.     
  181.     myErr = AECoerceDesc(sourceDesc,typeQDPoint,&resultDesc);
  182.     
  183.     if (myErr==noErr) 
  184.     {
  185.         GetRawDataFromDescriptor(&resultDesc, (Ptr)result, sizeof(Point), &ptSize);
  186.                                                          
  187.         if ( ptSize < sizeof( Point ) ) 
  188.             myErr = errAECoercionFail;
  189.     }
  190.     
  191.     (void)AEDisposeDesc(&resultDesc);
  192.         
  193.     return(myErr);
  194. } // GetPointFromDescriptor
  195.  
  196.  
  197. // ----------------------------------------------------------------------
  198. //    Name:        GotRequiredParams
  199. //    Function:    Checks all parameters defined as 'required' have been read
  200. // ----------------------------------------------------------------------
  201.                             
  202. OSErr    GotRequiredParams(const AppleEvent *theAppleEvent)
  203. {
  204.     DescType    returnedType;
  205.     Size        actualSize;
  206.     OSErr        err;
  207.     
  208.         // look for the keyMissedKeywordAttr, just to see if it's there
  209.     
  210.     err = AEGetAttributePtr(theAppleEvent, keyMissedKeywordAttr, typeWildCard,
  211.                                                 &returnedType, NULL, 0, &actualSize);
  212.     
  213.     switch (err)
  214.     {
  215.         case errAEDescNotFound:        // attribute not there means we
  216.             err = noErr;            // got all required parameters.
  217.             break;
  218.             
  219.         case noErr:                    // attribute there means missed
  220.             err = errAEParamMissed;    // at least one parameter.
  221.             break;
  222.             
  223.         // default:        pass on unexpected error in looking for the attribute
  224.     }
  225.     
  226.     return(err);
  227. } // GotReqiredParams
  228.  
  229.  
  230. // This routine takes a result descriptor, a reply descriptor and an error.
  231. // If there is a result to add to the reply it makes sure the reply isn't
  232. // NULL itself then adds the result to the reply depending on the error
  233. // and the type of result.
  234.  
  235. OSErr    AddResultToReply(AEDesc* result, AEDesc* reply, OSErr error)
  236. {
  237.     OSErr    err;
  238.  
  239.         // Check that the reply is not NULL and there is a result to put in it  
  240.     if (typeNull == reply->descriptorType || typeNull == result->descriptorType)
  241.         return(error);
  242.     
  243.     if (noErr == error)
  244.         err = AEPutParamDesc(reply, keyDirectObject, result);
  245.     else
  246.     {
  247.         switch (result->descriptorType)
  248.         {
  249.             case typeInteger:
  250.                 err = AEPutParamDesc(reply, keyErrorNumber, result);
  251.                 break;
  252.                 
  253.             case typeChar:
  254.                 err = AEPutParamDesc(reply, keyErrorString, result);
  255.                 break;
  256.                 
  257.             default:
  258.                 err = errAETypeError;
  259.         }
  260.         
  261.         if (noErr == err)
  262.             err = error;        // Don't loose that error
  263.     }
  264.  
  265.     return(err);
  266. }
  267.  
  268. // -----------------------------------------------------------------------
  269. //        Name:             MakeSelfAddress
  270. //        Purpose:        Builds an AEAddressDesc for the current process
  271. // -----------------------------------------------------------------------
  272.     
  273. OSErr    MakeSelfAddress(AEAddressDesc *selfAddress)
  274. {
  275.     ProcessSerialNumber procSerNum;
  276.     
  277.     procSerNum.highLongOfPSN = 0;
  278.     procSerNum.lowLongOfPSN  = kCurrentProcess;
  279.     
  280.     return(AECreateDesc(typeProcessSerialNumber, (Ptr)&procSerNum, sizeof(procSerNum), selfAddress));
  281. } // MakeSelfAddress
  282.  
  283.  
  284.  
  285. OSErr    GetEnumeratedFromDescriptor(const AEDesc *sourceDesc, DescType  *result)
  286. {
  287.     OSErr   myErr;
  288.     OSErr   ignoreErr;
  289.     Size    enumSize;
  290.     AEDesc  resultDesc;
  291.     
  292.     *result = typeNull;
  293.     
  294.     myErr = AECoerceDesc(sourceDesc,typeEnumerated,&resultDesc);
  295.     
  296.     if (myErr==noErr)
  297.     {
  298.         GetRawDataFromDescriptor(&resultDesc, (Ptr)result, sizeof(DescType), &enumSize);
  299.     
  300.         if (enumSize<sizeof(DescType))
  301.             myErr = errAECoercionFail;
  302.     }
  303.     
  304.     if (resultDesc.dataHandle)
  305.         ignoreErr = AEDisposeDesc(&resultDesc);
  306.     
  307.     return(myErr);
  308. } // GetEnumeratedFromDescriptor
  309.  
  310.  
  311.  
  312.